/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

export const _util = {
  serviceIds: new Map(),
  DI_TARGET: '$di$target',
  DI_DEPENDENCIES: '$di$dependencies',
  getServiceDependencies(ctor) {
      return ctor[this.DI_DEPENDENCIES] || [];
  },
};
export const IInstantiationService = createDecorator('instantiationService');
function storeServiceDependency(id, target, index) {
  if (target[_util.DI_TARGET] === target) {
      ;
      target[_util.DI_DEPENDENCIES].push({ id, index });
  }
  else {
      ;
      target[_util.DI_DEPENDENCIES] = [{ id, index }];
      target[_util.DI_TARGET] = target;
  }
}
/**
* The *only* valid way to create a {{ServiceIdentifier}}.
*/
export function createDecorator(serviceId) {
  if (_util.serviceIds.has(serviceId)) {
      return _util.serviceIds.get(serviceId);
  }
  const id = function (target, key, index) {
      if (arguments.length !== 3) {
          throw new Error('@IServiceName-decorator can only be used to decorate a parameter');
      }
      storeServiceDependency(id, target, index);
  };
  id.toString = () => serviceId;
  _util.serviceIds.set(serviceId, id);
  return id;
}
